package com.miyu.common.utils.http;

import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson2.JSONObject;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;

import java.util.Map;
import java.util.concurrent.*;
/**
 * http跑龙套
 * @author longm
 * @date 2023/01/02
 */
@Slf4j
public class HttpUtils {

    private static final String CONTENT_TYPE = "Content-Type";
    private static final String AUTHORIZATION = "Authorization";
    private static final String CONTENT_TYPE_VALUE = "application/x-www-form-urlencoded";
    private static final String CONTENT_TYPE_VALUE_JSON = "application/json";
    private static ObjectMapper json = new ObjectMapper();
    private static ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
    //重试间隔
    private static long sleepTime = 1L;
    //重试次数
    private static int attemptNumber = 5;
    //设置重试机制
//    private final static Retryer<String> retryer = RetryerBuilder.<String>newBuilder()
//            .retryIfResult(Predicates.<String>isNull())    // 设置自定义段元重试源
//            .retryIfExceptionOfType(Exception.class)        // 设置异常重试源
//            .retryIfRuntimeException()                      // 设置异常重试源
//            .withStopStrategy(StopStrategies.stopAfterAttempt(attemptNumber))   // 设置重试次数    设置重试超时时间？？？？
//            .withWaitStrategy(WaitStrategies.fixedWait(sleepTime, TimeUnit.SECONDS)) // 设置每次重试间隔
//            .build();


    /**
     * 设备上线使用
     * @param url
     * @param paramMap
     * @param timeout
     */
//    public static void deviceOnline(String url, Map<String, Object> paramMap, int timeout) {
//
//        cachedThreadPool.execute(new Runnable() {
//            @Override
//            public void run() {
//                postByRetry("",null,1);
//            }
//        });
//
//    }
    /**
     *
     * @param url 访问路径
     * @param paramMap 请求体
     * @param timeout 超时时间  单位: 秒
     * @return
     * @throws JsonProcessingException
     */
//    public static String postByRetry(String url, Map<String, Object> paramMap, int timeout) {
//
//
//        Callable<String> task = new Callable<String>() {
//            int i = 0;
//            @Override
//            public String call() throws Exception {
//                i++;
//                if(i > 1){
//                    log.info("请求初次执行失败,开始第{}次执行！", i);
//                }
//                String result = post(url, paramMap, timeout);
//                return result;
//            }
//        };
//
//        String res = "";
//        try {
//            //执行任务的重试，得到返回结果
//            res = retryer.call(task);
//        } catch (ExecutionException e) {
//            log.error("Post ExecutionException", e);
//        } catch (RetryException e) {
//            log.error("Post RetryException", e);
//        }
//        return res;
//    }

    public static String post(String url, String param){
        JSONObject jsonObject = JSONObject.parseObject(param);
        String result = HttpRequest
                .post(url).header(CONTENT_TYPE,CONTENT_TYPE_VALUE_JSON).timeout(5 * 1000)
                .body(param).execute().body();

        return result;
    }

    /**
     *
     * @param url 访问路径
     * @param paramMap 请求体
     * @param timeout 超时时间  单位: 秒
     * @return
     * @throws JsonProcessingException
     */
    public static String post(String url, Map<String, Object> paramMap, int timeout) throws JsonProcessingException {
        String map = json.writeValueAsString(paramMap);
        String result = HttpRequest
                .post(url).header(CONTENT_TYPE,CONTENT_TYPE_VALUE).timeout(timeout * 1000)
                .body(map).execute().body();

        return result;
    }


    /**
     *
     * @param url 访问路径
     * @param map 请求体
     * @param timeout 超时时间  单位: 秒
     * @return
     */
    public static String post(String url, String map, int timeout)  {

        String result = HttpRequest
                .post(url).header(CONTENT_TYPE,CONTENT_TYPE_VALUE).timeout(timeout * 1000)
                .body(map).execute().body();

        return result;
    }

    /**
     *
     * @param url 访问路径
     * @param map 请求体
     * @param timeout 超时时间  单位: 秒
     * @return
     */
    public static String post(String url, String map, int timeout,String authorization)  {

        String result = HttpRequest
                .post(url).header(CONTENT_TYPE,CONTENT_TYPE_VALUE).header(AUTHORIZATION,authorization)
                .timeout(timeout * 1000)
                .body(map).execute().body();

        return result;
    }


    /**
     *
     * @param url 访问路径
     * @param timeout 超时时间  单位: 秒
     * @param authorization 认证token
     */
    public static String get(String url, int timeout,String authorization)  {

        String result = HttpRequest.get(url).header(CONTENT_TYPE,CONTENT_TYPE_VALUE_JSON).header(AUTHORIZATION,authorization)
                .timeout(timeout * 1000).execute().body();

        return result;
    }


    /**
     *
     * @param url 访问路径
     * @param timeout 超时时间  单位: 秒
     * @param authorization 认证token
     */
    public static String delete(String url, int timeout,String authorization ,String map)  {

        String result = HttpRequest.delete(url).header(CONTENT_TYPE,CONTENT_TYPE_VALUE_JSON).header(AUTHORIZATION,authorization)
                .timeout(timeout * 1000).body(map).execute().body();

        return result;
    }

    /**
     *
     * @param url 访问路径
     * @param timeout 超时时间  单位: 秒
     * @param authorization 认证token
     */
    public static String delete(String url, int timeout,String authorization )  {

        String result = HttpRequest.delete(url).header(CONTENT_TYPE,CONTENT_TYPE_VALUE_JSON).header(AUTHORIZATION,authorization)
                .timeout(timeout * 1000).execute().body();

        return result;
    }
}
